#version 330 core

uniform vec3 lightPos;  // 光源位置
uniform vec3 objectColor; // 物体颜色
uniform vec3 lightColor; // 光的颜色
uniform vec3 viewPos; // 视点位置

out vec4 FragColor; // 着色器计算出的颜色输出。

// 顶点法向量和位置
in vec3 Normal;
in vec3 FragPos;


// 环境光照和漫反射光照的计算
void main()
{
    // ambient - 环境光照
    // 把环境光照添加到场景里非常简单。（光的颜色）*（常量环境因子）*（物体的颜色）
    float ambientStrength = 0.1;
    vec3 ambient = ambientStrength * lightColor;

    // diffuse - 漫反射光照
    vec3 norm = normalize(Normal);
    vec3 lightDir = normalize(lightPos - FragPos);
    float diff = max(dot(norm, lightDir), 0.0); // diff的值是介于0和1之间的一个数，表示漫反射光照的强度
    vec3 diffuse = diff * lightColor;

    // specular - 镜面光照
    float specularStrength = 0.5; // 影响系数
    vec3 viewDir = normalize(viewPos - FragPos); // 视线方向
    vec3 reflectDir = reflect(-lightDir, norm);  // 计算了光线在表面上的反射方向向量
    float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32); // 镜面反射强度
    vec3 specular = specularStrength * spec * lightColor;  

    vec3 result = (ambient + diffuse + specular) * objectColor;
    FragColor = vec4(result, 1.0);
}